<?php
/* *
 * 功能：支付宝服务器异步通知页面
 * 版本：3.2
 * 日期：2011-03-25
 * 说明：
 * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。


 *************************页面功能说明*************************
 * 创建该页面文件时，请留心该页面文件中无任何HTML代码及空格。
 * 该页面不能在本机电脑测试，请到服务器上做测试。请确保外部可以访问该页面。
 * 该页面调试工具请使用写文本函数logResult，该函数已被默认关闭，见alipay_notify_class.php中的函数verifyNotify
 * 如果没有收到该页面返回的 success 信息，支付宝会在24小时内按一定的时间策略重发通知
 
 * WAIT_BUYER_PAY(表示买家已在支付宝交易管理中产生了交易记录，但没有付款);
 * WAIT_SELLER_SEND_GOODS(表示买家已在支付宝交易管理中产生了交易记录且付款成功，但卖家没有发货);
 * WAIT_BUYER_CONFIRM_GOODS(表示卖家已经发了货，但买家还没有做确认收货的操作);
 * TRADE_FINISHED(表示买家已经确认收货，这笔交易完成);
 */
require_once($_SERVER['DOCUMENT_ROOT'] . '/all.conf.php');
require_once(__PHY_LIB.'/inc/api.inc.php');
require_once(__PHY_LIB.'/class/FnOrder.class.php');

require_once("alipay.config.php");
require_once("lib/alipay_notify.class.php");

//计算得出通知验证结果
$alipayNotify = new AlipayNotify($aliapy_config);
$verify_result = $alipayNotify->verifyNotify();

if($verify_result) {//验证成功
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//请在这里加上商户的业务逻辑程序代
	
	//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
	//获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
	$out_trade_no	= $_POST['out_trade_no'];	//获取订单号
	$trade_no		= $_POST['trade_no'];		//获取支付宝交易号
	$total_fee		= $_POST['price'];			//获取总价格

	if($_POST['trade_status'] == 'WAIT_BUYER_PAY') {
	//该判断表示买家已在支付宝交易管理中产生了交易记录，但没有付款
	
		/// 加入代码
		 // 只记录支付宝交易号
		 //;
		if (0 < $oOrder->getID() && 'unpaid' == $oOrder->get('status')) {
			$oOrder = new Order($out_trade_no);
			$oOrder->set('payment_sn', $trade_no);
			$oOrder->update();
			/// 订单更新日志 ///
			$rParam = array(
				'PaymentSn' => $trade_no,
			);
			$oOrder->addChangelog('nochange', $rParam);
		}

		echo "success";		//请不要修改或删除

		//调试用，写文本函数记录程序运行情况是否正常
		//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
	}
	else if($_POST['trade_status'] == 'WAIT_SELLER_SEND_GOODS') {
	//该判断表示买家已在支付宝交易管理中产生了交易记录且付款成功，但卖家没有发货
	
		/// 加入代码
		 // 如果订单状态为未付款，改为已付款
		 //;
		$oOrder = new Order($out_trade_no);
		if (0 < $oOrder->getID() && 'unpaid' == $oOrder->get('status')) {
			$oOrder->set('payment_sn', $trade_no);
			$oOrder->set('status', 'prepaid');
			$oOrder->update();
			/// 订单更新日志 ///
			$rParam = array(
				'Price' => $total_fee,
				'Method' => 'alipay_order',
				'PaymentSn' => $trade_no,
			);
			$oOrder->addChangelog('prepay', $rParam);
		}
			
		echo "success";		//请不要修改或删除

		//调试用，写文本函数记录程序运行情况是否正常
		//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
	}
	else if($_POST['trade_status'] == 'WAIT_BUYER_CONFIRM_GOODS') {
	//该判断表示卖家已经发了货，但买家还没有做确认收货的操作
	
		/// 加入代码
		 // 如果订单状态为已付款到担保方，改为发货中
		 //;
		$oOrder = new Order($out_trade_no);
		if (0 < $oOrder->getID() && 'prepaid' == $oOrder->get('status')) {
			$oOrder->set('payment_sn', $trade_no);
			$oOrder->set('status', 'shipping');
			$oOrder->update();
			$oOrder->reduceStockLock();
			/// 订单更新日志 ///
			$rParam = array(
				'Price' => $total_fee,
				'Method' => 'alipay_order',
				'PaymentSn' => $trade_no,
			);
			$oOrder->addChangelog('ship', $rParam);
		}
			
		echo "success";		//请不要修改或删除

		//调试用，写文本函数记录程序运行情况是否正常
		//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
	}
	else if($_POST['trade_status'] == 'TRADE_FINISHED') {
	//该判断表示买家已经确认收货，这笔交易完成
	
		/// 加入代码
		 // 如果订单状态为发货中，改为已确认完成订单
		 //;
		$oOrder = new Order($out_trade_no);
		if (0 < $oOrder->getID() && 'shipping' == $oOrder->get('status')) {
			$oOrder->set('payment_sn', $trade_no);
			$oOrder->set('status', 'closed');
			$oOrder->update();
			$oOrder->reduceStockLock();
			/// 订单更新日志 ///
			$rParam = array(
				'Price' => $total_fee,
				'Method' => 'alipay_order',
				'PaymentSn' => $trade_no,
			);
			$oOrder->addChangelog('close', $rParam);
		}
			
		echo "success";		//请不要修改或删除

		//调试用，写文本函数记录程序运行情况是否正常
		//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
	}
	else {
		//其他状态判断
		echo "success";

		//调试用，写文本函数记录程序运行情况是否正常
		//logResult ("这里写入想要调试的代码变量值，或其他运行的结果记录");
	}
	
	//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
	//验证失败
	echo "fail";

	//调试用，写文本函数记录程序运行情况是否正常
	//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
}
?>
